package com.frame.jfinal.controller;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.frame.ar.hander.DataHander;
import com.frame.ar.kit.ObjKit;
import com.frame.ar.util.MapUtil;
import com.frame.ar.vo.ActionReuslt;
import com.frame.ar.vo.CommReuslt;
import com.jfinal.core.Controller;
import com.jfinal.kit.JsonKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Record;
import com.system.model.Argument;
import com.weixin.model.AppUser;

/*******************************************
 * 作用描述：基础控制器，封装公共方法
 *******************************************
 * @author LRC
 * @createDate 2015-9-12
 * @version v1.0 
 * @updateRecord 格式：时间，作者，修改说明
 *******************************************
 * 
 */
public abstract class BaseController extends Controller {

	
	/*******************************************
	 * 功能描述：设置数据字典参数 
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param arg 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	protected void setArg(String...arg){
		for(String a : arg){
			//获取信息分类
			List<Record> infoClass = Argument.getArg(a);
			setAttr(a, JSONArray.fromObject(MapUtil.getMapListFromRecord(infoClass)).toString());
		}
	}
	
	/*******************************************
	 * 功能描述：
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param success
	 * @param msgs 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	protected void actionResult(boolean success,String msg){
		ActionReuslt result = new ActionReuslt();
		result.setSuccess(success);
		result.setMsg(msg);
		//判断是否为跨域请求，根据callback请求参数是否为空来判断
		String callback = getPara("callback");
		if(StrKit.isBlank(callback)){
			renderJson(result);
		}else{
			//ajax跨域调用模式
			renderJsonP(result);
		}
	}
	protected void actionResult(boolean success){
		actionResult(success,"");
	}
	protected void commResult(int code,Object data){
		CommReuslt result = new CommReuslt();
		result.setCode(code);
		result.setData(data);
		//判断是否为跨域请求，根据callback请求参数是否为空来判断
		String callback = getPara("callback");
		if(StrKit.isBlank(callback)){
			renderJson(result);
		}else{
			//ajax跨域调用模式
			renderJsonP("callback",result);
		}
	}

	/**
	 * 功能描述：Ajax跨域请求，返回脚本数据
	 * @createDate 2015年10月17日 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	protected void renderJsonP(String callback,Object data){
		if(StrKit.isBlank(callback)){
			callback = "callback";
		}
		String callbackFunc = getPara(callback);
		
		String dataJson = data == null ? "null" : JsonKit.toJson(data);
		
		renderText(callbackFunc + "("+dataJson+")");
	}
	
	protected void renderJsonP(Object data){
		
		String callbackFunc = getPara("callback");
		
		String dataJson = data == null ? "null" : JsonKit.toJson(data);
		
		renderText(callbackFunc + "("+dataJson+")");
	}
	
	/*******************************************
	 * 功能描述：保留需要的参数返回到客户端
	 *******************************************
	 * @createDate 2015-9-19 by LRC
	 * @param params 参数列表，空时返回所有
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	protected void keepParamRender(String...params){
		if(params==null||params.length==0){
			Enumeration<String> ps = getParaNames();
			while(ps.hasMoreElements()){
				String p = ps.nextElement();
				setAttr(p, getPara(p));
			}
		}else{
			for(String p : params){
				setAttr(p, getPara(p));
			}
		}
	}
	
	/*******************************************
	 * 功能描述：获取action，为空则返回空字符串，否则返回action
	 *******************************************
	 * @createDate 2015-9-20 by LRC
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	protected String getAction(){
		String action = getPara("action");
		if(ObjKit.isNull(action)){
			return "";
		}
		return action.trim();
	}
	
	
	/**
	 * 功能描述：通过dataHander组件获取数据，向客户端返回json数据
	 * @createDate 2015年10月24日 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	protected void renderByDataHander(String dataId){
		String params = getPara("params");
		Map<String,Object> base = null;
		if(StrKit.isBlank(params)){
			base = MapUtil.create(this, null);
		}else{
			base = new HashMap<String,Object>();
			JSONObject data = JSONObject.fromObject(params);
			MapUtil.copyToMap(data, base, null);
		}
		try {
			//装载用户信息
			AppUser user = AppUser.getCurrentUser();
			if(user!=null){
				String personId = user.getStr("personId");
				base.put("personId", personId);
			}
			Object obj = DataHander.getData(dataId, base);
			renderJson(obj);
		} catch (Exception e) {
			e.printStackTrace();
			renderText("服务端请求处理异常");
		}
	}
	protected void renderByDataHander(){
		String dataId = getPara("dataId");
		renderByDataHander(dataId);
	}
}
